﻿using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

#pragma warning disable

[InitializeOnLoad]
public class CCK_Init
{
    static CCK_Init()
    {
        
        void SetTag(SerializedProperty tags, string name, int index)
        {
            SerializedProperty sp = tags.GetArrayElementAtIndex(index);
            if (sp != null) sp.stringValue = name;
        }
        
        void SetLayer(SerializedProperty layers, string name, int index)
        {
            SerializedProperty sp = layers.GetArrayElementAtIndex(index);
            if (sp != null) sp.stringValue = name;
        }

        string cckSymbol = "CVR_CCK_EXISTS";
        string defines = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup);
        if (!defines.Contains(cckSymbol))
        {
            PlayerSettings.SetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup, (defines + ";" + cckSymbol));
            Debug.Log("[CCK:Init] Added CVR_CCK_EXISTS Scripting Symbol.");
        }

        if (LayerMask.LayerToName(10) != "PlayerNetwork" || LayerMask.LayerToName(15) != "CVRReserved4" || LayerMask.LayerToName(17) != "CVRPickup")
        {
            Debug.Log("[CCK:Init] TagManager asset has to be recreated. Now recreating.");

            SerializedObject tagManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset")[0]);
            
            SerializedProperty tagProperty = tagManager.FindProperty("tags");
            
            var tagList = new (int, string)[]
            {
                (0, "CCKEditorUI_Uploader"),
                (1, "CCKSerializable"),
                (2, "CCKLambda"),
                (3, "CCKNetwork_System"),
                (4, "CCKNetwork_Routine"),
                (5, "ThisIsGarbage")
            };
            
            foreach (var tag in tagList) SetTag(tagProperty, tag.Item2, tag.Item1);

            SerializedProperty layerProperty = tagManager.FindProperty("layers");
            
            var layerList = new (int, string)[]
            {
                (8, "PlayerLocal"),
                (9, "PlayerClone"),
                (10, "PlayerNetwork"),
                (11, "MirrorReflection"),
                (12, "CVRReserved1"),
                (13, "CVRReserved2"),
                (14, "CVRReserved3"),
                (15, "CVRReserved4"),
                (16, "PostProcessing"),
                (17, "CVRPickup"),
                (18, "CVRInteractable")
            };
            
            foreach (var layer in layerList) SetLayer(layerProperty, layer.Item2, layer.Item1);

            tagManager.ApplyModifiedProperties();
        }

        if (!PlayerSettings.virtualRealitySupported)
        {
            Debug.Log("[CCK:Init] XR and render settings have to be changed. Now changing.");
            EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTargetGroup.Standalone, BuildTarget.StandaloneWindows64);
            PlayerSettings.colorSpace = UnityEngine.ColorSpace.Linear;

            PlayerSettings.apiCompatibilityLevel = ApiCompatibilityLevel.NET_4_6;
            
            PlayerSettings.virtualRealitySupported = true;
            PlayerSettings.SetVirtualRealitySDKs(BuildTargetGroup.Standalone, new string[] { "None", "Oculus", "OpenVR", "MockHMD" });
            PlayerSettings.stereoRenderingPath = StereoRenderingPath.SinglePass;
        }
        
        if (LayerMask.LayerToName(10) == "PlayerNetwork" && LayerMask.LayerToName(17) == "CVRPickup" && LayerMask.LayerToName(15) == "CVRReserved4"  && PlayerSettings.virtualRealitySupported )
        {
            Debug.Log("[CCK:Init] Verified TagManager and ProjectSettings. No need to readjust.");
        }
    }
}
